# -*- coding: utf-8 -*-
# File : user_services.py
# Author: taoyahui
# Date : 2021/4/8

from student.results import *
from student.models import *
from hashlib import md5
from student import utils, redis_utils


# 管理员登录接口
def login(dict):
    # 判断username和password参数是否在request请求中
    if not utils.has_keys(dict, 'username', 'password'):
        return info_incomplete_result
    # 通过username获取数据库对应的管理员信息
    admin = user.objects.get(username=dict['username'])
    # 加密用户的密码
    md5_passwd = md5(dict['password'].encode('utf8')).hexdigest()
    # 将输入密码与数据库用户的密码匹配
    if md5_passwd == admin.passwd:
        # 如果密码匹配，处理用户token信息，存入redis数据库
        token = utils.gen_token()  # 生成token
        # 在数据库中存储以token为key，username为value的键值对
        redis_utils.set_value(token, dict['username'])
        # 返回包含token的内容
        msuccess_result = json.dumps({'code': 200, 'data': {'content': 'ok', 'token': token}})
        return msuccess_result
    else:
        # 若信息有误返回通用result
        return login_failed_result


def logout(token):
    redis_utils.delete_value(token)
    return success_result


# 新建管理员接口
def register(dict):
    # 判断请求内容中是否有username和password字段
    if utils.has_keys(dict, 'username', 'password'):
        return info_incomplete_result
    passwd_encode = md5(dict['passwd'].encode('utf8')).hexdigest() # 将password用md5加密
    username = dict['username']
    new_user = user(username=username, passwd=passwd_encode) #存储username和加密的password信息
    new_user.save() # 保存
    return success_result


# 通过token获取用户登录信息
def get_token_info(token):
    username = redis_utils.get_value(token)  # 从redis中获取token对应的用户名
    # 如果用户名为空则返回通用错误信息
    if not username:
        return token_empty_result
    g_user = user.objects.get(username=username)  # 查询用户名对应的用户信息
    # 如果用户不存在返回报错信息，前端将自动跳转至登录页
    if not g_user:
        return token_empty_result
    # 返回token对应的用户信息，包括用户名和权限(默认为1)，此处格式为前端系统需要(请勿修改返回格式)
    m_token = {
        'code': 200,
        'data': {
            'role': 1,
            'nickname': g_user.username,
            'username': g_user.username
        }
    }
    return json.dumps(m_token)
